package com.qf.factory;

import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @version 1.0
 * 公众号：Java架构栈
 * @Author: 卓不凡
 */
/*
    工厂类，用来去获取对应的bean,对象，通过加载配置文件读取配置信息
    ，在用反射的方式去初始化对象
 */
public class BeanFactory {
    private static Properties properties;


    //工厂类加载的时候就应该将对应的配置文件加载生成实例
    //在static代码块里面就要完成bean的初始化
    //生成的bean实例要存储  集合
    private static Map<String, Object> beans;

    static {
        try {
            //获取输入流
            InputStream inputStream =
                    BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            properties = new Properties();
            properties.load(inputStream);
            //初始化map
            beans = new HashMap<String, Object>();
            //properties本身就是一个map ,{k:v,k1:v2}  {"accountDao":"com.qfedu.dao.impl.AccountDaoImpl","accountService":""}
            //获取properties本身就是一个map所有的key
            Enumeration<Object> keys = properties.keys();
            //循环去获取指定key的value值
            while (keys.hasMoreElements()) { //有没有下一个元素
                //获得key
                String key = keys.nextElement().toString();
                //获得value
                String value = properties.getProperty(key); //"com.qfedu.dao.impl.AccountDaoImpl"
                //通过反射获取对应实例bean
                Object o = Class.forName(value).newInstance();
                //将对应的bean存储到容器中
                beans.put(key, o);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //获取bean实例方法
    public static Object getBean(String name) {

        return beans.get(name);

      /*  String value = properties.getProperty(name);
        //通过反射获取实例
        //多例，每次调用重复去生成对象
        try {
            Object o = Class.forName(value).newInstance();
            return o;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;*/
    }
}
